#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>


// 在循环语句中利用if语句配合break和continue
// 能够实现在满足某种条件时，可以跳过部分循环体中的语句
//int main()
//{
//    int i = 1;//
//    do
//    {
//        i++;//
//        if (i == 5)
//        {
//            break;//
//        }
//        printf("%d ", i);//
//    } while (i <= 10);//
//    return 0;//
//}
//程序的结果是2 3 4


//换一个程序
//int main()
//{
//    int i = 1;//
//    do
//    {
//        i++;//
//        if (i == 5)
//        {
//            continue;//
//        }
//        printf("%d ", i);//
//    } while (i <= 10);//
//    return 0;//
//}//程序的结果是2 3 4 6 7 8 9 10 11

//练习：求1！+2！+ ... +10！
//int main()
//{
//    int i = 1;//
//    int j = 1;//
//    int ret = 1;//
//    int sum = 0;//
//    for (i = 1; i <= 10; i++)
//    {
//        ret = 1;//ret必须每次都置1才能保证每次算的结果能从1乘到i，
//        for (j = 1; j <= i; j++)
//        {
//            ret = ret * j;//
//        }
//        sum = sum + ret;//
//    }
//    printf("%d\n", sum);//
//    return 0;//
//}


//或者写成下面这个
// 求阶乘的第二种算法分析：比如求3的阶乘：
// 3! = 3 * 2! = (2+1) * 2! = (2+1) * 2 * 1 = (2+1) * (1+1) * 1
//int main()
//{
//    int i = 1;//
//    int n = 1;//
//    int ret = 1;//
//    int sum = 0;//
//    for (i = 1; i <= 10; i++)
//    {
//        ret = ret * i;//将阶乘看作之前的结果再乘以i++后的结果
//        sum = sum + ret;//将级数看作之前的结果再加上ret 
//    }
//    printf("%d\n", sum);//
//    return 0;//
//}

// 练习：
// 用二分法求一个整数在有序整数数组中下标
// 如果一个整型数组中的元素是随着下标的增长而单调递增的
// 则可以使用下列的二分法求出某个整数是否属于这个数组
//int main()
//{
//    int k = 7;//
//    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//
//    int sz = sizeof(arr) / sizeof(arr[0]);//
//    int left = 0;//
//    int right = 9;//
//    while (left <= right)
//    {
//        int mid = (left + right) / 2;//这种除法总是向下取整，但为了防止发生位溢出
//        //可以将这句改写成 int mid = left + (right - left) / 2;
//        //但不能写成int mid = left / 2 + right / 2;
//        if (arr[mid] < k)
//        {
//            left = mid + 1;//
//        }
//        else if (arr[mid] > k)
//        {
//            right = mid - 1;//
//        }
//        else
//        {
//            printf("找到了，下标是%d\n", mid);//
//            break;//当left和right的值在变动之后能够相等才执行else后的语句
//            //此时就应结束循环，所以直接给break
//        }//while的条件语句能够保证mid在区间[left, right]上
//      //整个if    else if    else语句保证了
//      // 当mid在区间[left, right]上时，总能判断k和arr[mid]
//      //的大小关系，以确保如果k在有序数列中，总能使得最后k等于arr[mid]
//    }
//    if (left > right)//while循环结束只有两种情况1、left > right 2、left = right
//    {
//        printf("找不到\n");//若是第1、种情况，
//    //如果数组是步长为1的自然数序列，比如{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
//    //此时left、right中必有一个变量一直在朝着一个方向在变动，
//    // 且即使变动到left = right
//    //也依然是那个一直在变动的变量继续超原来的方向移动
//    }
//    return 0;//
//}

//#include <windows.h>//对应system的头文件
//#include <stdlib.h>//对应Sleep的头文件
//// 练习
//int main()
//{
//    char arr1[] = { "welcome to bit" };//
//    char arr2[] = { "##############" };//
//    size_t left = 0;//
//    size_t right = strlen(arr2) - 1;//
//    while (left <= right)
//    {
//        arr2[left] = arr1[left];//
//        arr2[right] = arr1[right];//
//        printf("%s\n", arr2);//
//        Sleep(1000);//打印完当前的arr字符串后，等待1000ms,
//        system("cls");//等待1000ms后，将当前的arr字符串清零
//        // 视觉效果上，运行界面不会有上次循环体执行后打印的字符串
//        // 一直都只有一行字符串
//        left++;//
//        right--;//
//    }
//    printf("%s\n", arr2);
//    //跳出循环后arr1字符串和arr2字符串完全相同，打印最终的结果
//    //如果没有这句话，程序退出时，将不会显示字符串
//    return 0;//
//}

//练习：利用strcmp实现：
//判断键入的字符串是否和密码相同
//如果输错三次，退出程序
#include <string.h>
int main()
{
    int i = 0;//
    char mima[20] = { 0 };//
    for (i = 0; i < 3; i++)
    {
        printf("请输入密码:\n");//
        scanf("%s", mima);//
        if (strcmp(mima, "abcdef") == 0)
        //如果strcmp返回值为0，则两个字符串完全相同
        {
            printf("登陆成功\n");//
            break;//
        }
        else
        {
            printf("密码错误\n");//
        }
    }
    if (i == 3)
    {
        printf("三次密码均错误\n");
    }
    return 0;//
}